'''
变量的作用域：
1.全局变量；
2.局部变量；
3.global声明函数内部的变量为全局变量；
'''


a=100
def fuca():
    print(a)

def fucb():
    a=200
    print(a)
    print(f'局部变量a的值是{a}')

def fucc():
    #global声明全局变量
    global a
    a=300
    print(a)


fucb()
fuca()
fucc()
print(f'全局变量a的值为{a}')

'''
返回值作为参数传递
'''

def test1():
    return 50

def test2(num):
    print(num)

test2(test1())

'''
函数的返回值
'''
#eg.1错误的方法
def wrong1():
    return 1
    return 2 #这段代码执行不了

print(wrong1())

#eg.2 多个返回值,返回值是元组
def right1():
    return 1,2

print(right1())

#eg.3 return列表
def list1():
    return [7,8]

print(list1())

#eg.4 return字典
def dict1():
    return {'name':'pan','age':30}

print(dict1())
print(type(dict1()))

'''
函数的位置参数,按顺序传入参数
关键字参数，位置参数必须在关键字参数前，关键字参数的顺序随便
缺省参数，所有位置参数必须出现在默认值参数前面，包括函数定义和调用
不定长参数，不确定时，传递多个参数。
包裹关键字传递，传递的不确定参数，返回的是字典。
'''

def user_info(name,age,gender='男'):
    print(f'你的名字是{name},年龄是{age}，性别是{gender}')

user_info('pan',30,'male')
user_info(gender='male',age=30,name='pan')
user_info('test',20)

def no_limit(*args):
    print(args)

no_limit('pan',30)

def package_info(**kwargs):
    print(kwargs)

package_info(name='pan',age=30)
package_info()

'''
拆包：元组，return两个值时，是元组的，用多个变量去接受；
拆包：字典，return出来，获得的是key的值
'''
def return_num():
    return 100,200

num1,num2=return_num()

print(num1)
print(num2)

def return_dict():
    return {'name':'pan','age':30}

a,b=return_dict()
print(a)
print(b)
print(return_dict()[a])
print(return_dict()[b])

'''
交换变量：
1.借助第三变量存储数据,c=a,a=b,b=c；
2.两行代码实现；
'''
#eg.1
a=10
b=20
c=0
c=a
a=b
b=c
print(a,b)

#eg.2
a,b=1,2
a,b=b,a
print(a,b)

'''
引用：值是靠引用来传递的,修改可变类型的值，所有的引用的都跟着内存地址中的值变化；
    引用也是可以当作实参来转递的；
'''
a = 1
b = a

print(id(a))
print(id(b))

a=2
print(id(a))

aa=[10,20]
bb=aa

print(id(aa))
print(id(bb))

bb.append(30)
print(aa)

print(id(aa))
print(id(bb))

'''
可变数据类型：列表，字典，集合
不可变数据类型：整形，浮点，字符串，元组
'''